/**
 * @description 认证中间件 - 验证用户身份和权限
 */
const jwt = require('jsonwebtoken'); // 需要安装: npm install jsonwebtoken

/**
 * 验证用户是否已认证的中间件
 * @param {Object} req - 请求对象
 * @param {Object} res - 响应对象
 * @param {Function} next - 下一个中间件函数
 */
function authenticateToken(req, res, next) {
  // 从请求头中获取token
  const authHeader = req.headers['authorization'];
  
  
  // 提取token (Bearer TOKEN格式)
  const token = authHeader && authHeader.split(' ')[1];
  
  if (!token) {
    console.log('未找到有效的token');
    return res.status(401).json({ 
      message: '未提供认证令牌',
      details: authHeader ? '认证头格式错误，应为Bearer TOKEN' : 'Authorization头缺失'
    });
  }
  console.log(token);
  // 验证token
  
  jwt.verify(token, process.env.JWT_SECRET, (err, user) => {
    if (err) {
      console.log('Token验证失败:', process.env.JWT_SECRET);
      return res.status(403).json({ 
        message: '无效或已过期的令牌',
        errorType: err.name
      });
    }
    
    // 将用户信息附加到请求对象上，供后续路由使用
    req.user = user;
    console.log('Token验证成功，用户ID:', user.id);
    next();
  });
}

/**
 * 基于角色的权限验证中间件
 * @param {Array} allowedRoles - 允许访问的角色列表
 */
function authorizeRoles(allowedRoles) {
  return (req, res, next) => {
    // 确保authenticateToken中间件已在前面执行
    if (!req.user || !req.user.role) {
      return res.status(401).json({ message: '未认证的用户' });
    }
    
    // 检查用户角色是否在允许列表中
    if (allowedRoles.includes(req.user.role)) {
      next(); // 用户有权限，继续处理请求
    } else {
      res.status(403).json({ message: '没有权限执行此操作' });
    }
  };
}

module.exports = { authenticateToken, authorizeRoles };
